package main

import "fmt"

/**
当系统所提供的工厂所需生产的具体产品并不是一个简单的对象，而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。

抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式与工厂方法模式最大的区别在于，工厂方法模式针对的是一个产品等级结构，而抽象工厂模式则需要面对多个产品等级结构。
*/

type FactoryInterface interface {
	CreateProduct1() ProductInterface
	CreateProduct2() ProductInterface
}

type ProductInterface interface {
	Say()
}

type Product11 struct {
}

func (p *Product11) Say() {
	fmt.Println("product 11")
}

type Product22 struct {
}

func (p *Product22) Say() {
	fmt.Println("product 22")
}

type Factory11 struct {
}

func (f *Factory11) CreateProduct1() ProductInterface {
	return &Product11{}
}

func (f *Factory11) CreateProduct2() ProductInterface {
	return &Product22{}
}

func main() {
	factory := &Factory11{}
	product := factory.CreateProduct1()
	product.Say()
}
